<?php
/**
 * Core_Auth
 * 
 * @author naspeh
 * @version $Id: Auth.php 671 2008-06-30 12:06:16Z naspeh $
 */
class Core_Auth
{
    /**
     * Гостевая роль
     *
     */
    const GUEST_ROLE = "guest";
    /**
     * Гостевой пароль
     *
     */
    const GUEST_PASSWORD = "1q";
    /**
     * Родитель нового зарегестрированного пользователя
     *
     */
    const REGISTER_ROLE = 'user';
    protected static $_enableActive = true;
    /**
     * Флаг старта
     *
     * @var boolean
     */
    protected static $_isStarted = false; 
    /**
     * Стартует
     *
     */
    public static function start()
    {
        if (self::isStarted()) {
        	return;
        }
        $auth = Zend_Auth::getInstance();
        $auth->setStorage(new Zend_Auth_Storage_Session('authSpace'));
        if (!$auth->hasIdentity()) {
            $result = self::authenticate(self::GUEST_ROLE, self::GUEST_PASSWORD);
            if (!$result->isValid()) {
                throw new Core_Exception('guestAuthNotWork# Не работает гостевая авторизация.');
            }
        }
        self::setIsStarted(true);
    }
    /**
     * Возвращает флаг старта
     *
     * @return boolean
     */
    public static function isStarted()
    {
        return self::$_isStarted;
    }
    /**
     * Устанавливает флаг старта
     *
     * @param boolean $isStarted
     */
    public static function setIsStarted($isStarted)
    {
        self::$_isStarted = (boolean) $isStarted;
    }
    /**
     * Возвращает адаптер авторизации.
     *
     * @return Zend_Auth_Adapter_DbTable
     */
    public static function getAdapter ()
    {
        if (Zend_Registry::isRegistered('authAdapter')) {
            $authAdapter = Zend_Registry::get('authAdapter');
        } else {
            $dbAdapter = Core_Db::getInstance();
            $authAdapter = new Zend_Auth_Adapter_DbTable($dbAdapter, 'roles', 'name', 'password', 'md5(?)');
            Zend_Registry::set('authAdapter', $authAdapter);
        }
        return $authAdapter;
    }
    /**
     * Авторизация пользователя
     *
     * @param string $username
     * @param string $password
     * @return Zend_Auth_Result
     */
    public static function authenticate ($username, $password)
    {
        $auth = Zend_Auth::getInstance();
        $authAdapter = self::getAdapter();
        $authAdapter->setIdentity($username)->setCredential($password);
        $result = $auth->authenticate($authAdapter);
        if ($result->isValid()) {
            Zend_Session::rememberMe();
            self::init(true);
        }
        return $result;
    }
    /**
     * Завершает работу пользователя
     *
     */
    public static function logout()
    {
        Zend_Auth::getInstance()->clearIdentity();
        self::setIsStarted(false);
    }
    /**
     * Устанавливает флаг необходимости активации
     *
     * @param boolean $withActive
     */
    public static function setEnableActive($enableActive)
    {
        self::$_enableActive = (boolean) $enableActive;
    }
    /**
     * Возвращает флаг необходимости активации
     *
     * @return boolean
     */
    public static function getEnableActive()
    {
        return self::$_enableActive;
    }
    /**
     * Возвращает код для активации
     *
     * @param string $name
     * @param string $salt
     * @return string
     */
    public static function getHash($salt)
    {
        $hash = md5(
            mt_rand(1,1000000) 
            .  $salt 
            .  mt_rand(1,1000000)
        );
        return $hash;
    }        
    /**
     * Активация аккаунта
     *
     * @param string $code
     */
    public static function activeRole($code)
    {
        $tableRoles = new Core_Table_Roles();
        if (null === ($role = $tableRoles->fetchRow(array('code_confirm = ?' => $code)))) {
            Core_Message::add('Неверный код активации', Core_Message::TYPE_ERROR);
            return false;            
        }
        $role->code_confirm = null;
        $role->is_login = true;
        $role->save();
        Core_Message::add('Ваш аккаунт <b>' . $role->name . '</b> активирован');
        return true;        
    }
    /**
     * Активация нового email
     *
     * @param string $code
     */
    public static function activeNewEmail($code)
    {
        $tableRoles = new Core_Table_Roles();
        if (null === ($role = $tableRoles->fetchRow(array('code_confirm = ?' => $code)))) {
            Core_Message::add('Неверный код активации', Core_Message::TYPE_ERROR);
            return false;
        }
        $role->code_confirm = null;
        $role->email = $role->new_email;
        $role->new_email = null;
        $role->save();
        Core_Auth::init();
        Core_Message::add('Ваш новый email <b>'. $role->email . '</b> активирован'); 
        return true;        
    }
    public static function init($first=false)
    {
        $auth = Zend_Auth::getInstance();
        if ($first) {
        	$name = $auth->getIdentity();
        } else {
            $name = self::get('name'); 
        }
        $storage = $auth->getStorage();
        $rolesTable = new Core_Table_Roles();
        $row = $rolesTable->fetchRow(array('name = ?' => $name));
        $contents = $row->toArray();
        $contents['row'] = $contents;
        //$contents->name = $row->name;  
        $storage->write($contents);
    }
    /**
     * Возвращает переменную пользователя.
     *
     * @param string $name
     * @return mixed
     */
    public static function get($name = null)
    {
        $auth = Zend_Auth::getInstance();
        if (!$auth->hasIdentity()) {
            throw new Core_Exception('userNotAuth# Пользователь не авторизован.');
        } else{
            $contents = $auth->getIdentity();
            if (!isset($name)) {
                return $contents;
            } elseif (isset($contents[$name])) {
                return $contents[$name];
            } else {
            	return null;
            }
        }
    }
    /**
     * Устанавливает переменную пользователя.
     *
     * @param string $name
     * @param mixed $value
     */
    public static function set($name, $value = null)
    {
        $name = (string) $name;
        $auth = Zend_Auth::getInstance();
        if ($auth->hasIdentity()) {
            $storage = $auth->getStorage();
            $contents = $storage->read();
            $contents[$name] = $value;
            $storage->write($contents);
        } else {
            throw new Core_Exception('Пользователь не авторизован.');
        }
    }
    /**
     * Возвращает флаг послегостевой авторизации
     *
     * @return boolean
     */
    public static function isLogin()
    {
        if (self::GUEST_ROLE == self::get('name')) {
            return false;
        }
        return true;
    }
}
